package com.yunke.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Sa-Token 配置类
 * 
 * @author yunke
 * @since 1.0.0
 */
@Configuration
public class YunkeSaTokenConfig implements WebMvcConfigurer {

    /**
     * 注册Sa-Token拦截器，打开注解式鉴权功能
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册Sa-Token拦截器，定义详细认证规则
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 指定一条 match 规则
            SaRouter
                    // 拦截所有路径
                    .match("/**")
                    // 排除不需要认证的路径
                    .notMatch("/api/user/login")                    // 用户登录
                    .notMatch("/api/user/register")                 // 用户注册
                    .notMatch("/api/user/sendSms")                  // 发送验证码
                    .notMatch("/api/user/smsLogin")                 // 短信登录
                    .notMatch("/api/user/wechatLogin")              // 微信登录
                    .notMatch("/api/user/forgetPassword")           // 忘记密码
                    .notMatch("/api/dazi/category")                 // 获取搭子分类
                    .notMatch("/api/dazi/list")                     // 获取搭子列表
                    .notMatch("/api/dazi/detail")                   // 获取搭子详情
                    .notMatch("/api/service/category")              // 获取服务分类
                    .notMatch("/api/service/list")                  // 获取服务列表
                    .notMatch("/api/service/detail")                // 获取服务详情
                    .notMatch("/api/circle/list")                   // 获取动态列表
                    .notMatch("/api/circle/detail")                 // 获取动态详情
                    // 排除静态资源
                    .notMatch("/", "/index.html")
                    .notMatch("/favicon.ico")
                    .notMatch("/css/**", "/js/**", "/img/**")
                    .notMatch("/webjars/**")
                    .notMatch("/v2/api-docs/**")
                    .notMatch("/swagger-resources/**")
                    .notMatch("/doc.html")
                    .notMatch("/swagger-ui/**")
                    // 排除数据库监控
                    .notMatch("/druid/**")
                    // 排除健康检查
                    .notMatch("/actuator/**")
                    // 排除测试接口
                    .notMatch("/test/**")
                    // 执行认证
                    .check(r -> StpUtil.checkLogin());
        })).addPathPatterns("/**");
    }
} 